/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package classes;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Vector;

/**
 *
 * @author Bel
 */
public class Prova {

    private String materia;
    private String nivel;
    private String nomeDoProfessor;
    private int numeroDePerguntas;
    private Date data;
    private Vector<Pergunta> perguntas;
    StringBuilder prova = new StringBuilder();

    public Prova(String materia, String nivel, String nomeDoProfessor, int numeroDePerguntas, Date data) {
        String nivelParaXML = "";
        switch (nivel) {
            case "Fácil":
                nivelParaXML = "facil";
                break;
            case "Médio":
                nivelParaXML = "medio";
                break;
            case "Difícil":
                nivelParaXML = "dificil";
                break;
        }
        this.materia = materia;
        this.nivel = nivelParaXML;
        this.nomeDoProfessor = nomeDoProfessor;
        this.numeroDePerguntas = numeroDePerguntas;
        this.data = data;
    }

    /**
     * @return the materia
     */
    public String getMateria() {
        return materia;
    }

    /**
     * @param materia the materia to set
     */
    public void setMateria(String materia) {
        this.materia = materia;
    }

    /**
     * @return the nivel
     */
    public String getNivel() {
        return nivel;
    }

    /**
     * @param nivel the nivel to set
     */
    public void setNivel(String nivel) {
        this.nivel = nivel;
    }

    /**
     * @return the nomeDoProfessor
     */
    public String getNomeDoProfessor() {
        return nomeDoProfessor;
    }

    /**
     * @param nomeDoProfessor the nomeDoProfessor to set
     */
    public void setNomeDoProfessor(String nomeDoProfessor) {
        this.nomeDoProfessor = nomeDoProfessor;
    }

    /**
     * @return the numeroDePerguntas
     */
    public int getNumeroDePerguntas() {
        return numeroDePerguntas;
    }

    /**
     * @param numeroDePerguntas the numeroDePerguntas to set
     */
    public void setNumeroDePerguntas(int numeroDePerguntas) {
        this.numeroDePerguntas = numeroDePerguntas;
    }

    /**
     * @return the perguntas
     */
    public Vector<Pergunta> getPerguntas() {
        return perguntas;
    }

    /**
     * @param perguntas the perguntas to set
     */
    public void setPerguntas(Vector<Pergunta> perguntas) {
        this.perguntas = perguntas;
    }

    public String gerarProva() {
        perguntas = getPerguntasdoNivelEMateria(nivel, materia);
        if (sorteiaPerguntas(numeroDePerguntas)){
            return escreveProva(false);
        }else{
            return "";
        }
    }

    public String gerarGabarito() {
        if (!perguntas.isEmpty()) {
            return escreveProva(true);
        } else {
            return "";
        }

    }

    private Vector<Pergunta> getPerguntasdoNivelEMateria(String nivel, String materia) {
        return Pergunta.getListadePerguntas(nivel, materia);
    }

    private boolean sorteiaPerguntas(int numeroDePerguntas) {
        Pergunta p;
        if (perguntas.size() < numeroDePerguntas) {
            return false;
        }
        Vector<Pergunta> perguntasAux = new Vector<>();
        int j = 0;
        for (int i = 0; i < numeroDePerguntas; i++) {
            p = perguntas.elementAt((int) (Math.random() * numeroDePerguntas));
            if (!perguntasAux.contains(p)) {
                perguntasAux.add(p);
            } else {
                i--;
            }
        }
        perguntas = perguntasAux;
        return true;
    }

    private String escreveProva(boolean gabarito) {
        int i = 1;
        prova.delete(0, prova.length());
        prova.append("Curso: Sistemas de Informação\n");
        prova.append("Disciplina: ").append(materia).append("\n");
        SimpleDateFormat f = new SimpleDateFormat("dd/MM/yyyy");
        prova.append("Data: ").append(f.format(data)).append("\n");
        prova.append("Professor: ").append(nomeDoProfessor).append("\n");
        prova.append("Aluno:\n");
        prova.append("Nota:\n\n");
        prova.append("Prova");
        if (gabarito) {
            prova.append(" - Gabarito");
        }
        prova.append("\n\n");
        prova.append("Assinale a alternativa correta:\n\n");
        for (Pergunta pergunta : perguntas) {
            prova.append(i).append(" ").append(pergunta.getDescricao()).append("\n");
            for (int j = 0; j < pergunta.getRespostas().length; j++) {
                if (gabarito && j == pergunta.getRespostaCorreta() - 1) {
                    prova.append("(X) ");
                } else {
                    prova.append("( ) ");
                }
                prova.append(pergunta.getRespostas()[j]).append("\n");
            }
            prova.append("\n");
            i++;
        }
        return prova.toString();
    }
}
